题目:
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
分析:
需要合并的两个链表是有序的,所以合成的新链表也需要是有序的,这就需要我们在合并过程中对链表中的各节点进行排序。
我的思路是这样的:因为链表是有序的,所以将两个链表的节点从头开始比较,小的对应节点放在要合成的链表中,然后这个节点向后走一位,和另一个链表当中上一个较大的那个节点重新比较,选出小的节点放在合成链表中,在这个过程中确保每个节点都有被排序。
代码:
public ListNode mergeTwoLists2(ListNode headA, ListNode headB) {
ListNode newHead = new ListNode(-1);
ListNode tmp = newHead;
//循环结束的条件是将headA/headB任意一个遍历完
while(headA != null && headB != null) {
//判断headA和headB的大小,将小的对应节点放在tmp后边,并且tmp和headA/headB都要向后走一个节点
if(headA.val < headB.val) {
tmp.next = headA;
tmp = tmp.next;
headA = headA.next;
}else {
tmp.next = headB;
tmp = tmp.next;
headB = headB.next;
}
}
//因为两个链表都是有序的,所以直接将长的链表的剩余部分插到tmp后边即可
if(headA == null) {
tmp.next = headB;
}else {
tmp.next = headA;
}
return newHead.next;
}