将两个有序链表合并为一个新的有序链表并返回。
新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
题目分析:
要将两个有序的链表连接起来,可以设置两个指针分别指向两个链表的头节点,从头节点开始比较值,把值小的节点加在另一个节点后面,比较完后,两个指针后移再比较,如果两个链表的长度不一样,比较结束后,再将比较长的链表剩余的节点连接起来。
代码实现:
public static class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode temp = new ListNode(0); ListNode res = temp; while (l1 != null && l2 != null) { if (l1.val <= l2.val){ temp.next = l1; l1 = l1.next; temp = temp.next; } else { temp.next = l2; l2 = l2.next; temp = temp.next; } } if (l1 == null){ temp.next = l2; } if (l2 == null){ temp.next = l1; } return res.next; }
注意,函数中返回的是res.next,而不是返回res,这是因为刚开始给temp new了一个节点值为0,它在结果中是不需要输出的。
主函数:
public static void main(String[] args) { L3 l = new L3(); ListNode l1 = new ListNode(1); l1.next = new ListNode(2); l1.next.next = new ListNode(4); ListNode l2 = new ListNode(1); l2.next = new ListNode(3); l2.next.next = new ListNode(4); ListNode res = l.mergeTwoLists(l1,l2); while (res != null){ System.out.print(res.val + " "); res = res.next; } }
运行结果:
1 1 2 3 4 4