1、合并两个有序链表
解法:因为两个链表都是有序的,可以定义一个虚拟节点,让两个链表的每个节点的数据域循环比较,不断将小的节点挂接在虚拟节点上串起一个新的链表。
eg:有如下两个单链表
串上第一个节点
串上第二个
。。。直到最后
合并之后:
分析:不断地通过两个指向头节点的变量遍历链表,数据域小的那个挂接在新的链表上,定义一个head始终指向新链表的头,temp指向新链表的当前最后节点。找到一个就尾插。
详细步骤:
- new一个虚拟节点并让head指向新节点的头,定义一个变量temp指向头
- headA和headB两个变量分别遍历两个链表,两个节点的数据域进行比较,小地一个比如headA就尾插到temp的next域,然后headA指向下一个节点再跟headB比较。
- 直到其中一个链表遍历完推出循环,此时如果两个链表不一样长,则总存在一个链表没有遍历完,由于两个链表都是有序的,所以剩下没有比较的一定都大于前面的,所以直接挂接在后面就可以了。
java描述的源代码
public ListNode mergeTwoLists(ListNode headA, ListNode headB) {
ListNode node = new ListNode(-1);
ListNode temp = node;
while(headA != null && headB != null){
if(headA.val < headB.val){
temp.next = headA;
headA = headA.next;
temp = temp.next;
} else {
temp.next = headB;
headB = headB.next;
temp = temp.next;
}
}
if(headA != null){
temp.next = headA;
}
if(headB != null){
temp.next = headB;
}
return node.next;
}