剑指Offer 合并两个排序的链表

Posted wjq2017

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer 合并两个排序的链表相关的知识,希望对你有一定的参考价值。

  题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

  题目链接:合并两个排序的链表

  思路:类似于2路归并排序的合并操作,先取两个链表首结点值小者作为新链表的首结点,然后遍历两个链表,取小者作为其后继结点,直到至少有一个链表为空,最后把至多一个非空链表首结点作为其后继结点。2路归并排序的具体内容可以看数据结构 归并排序这篇博客。

  步骤:

  1 如果一个链表为空,则返回另一个链表。

  2 取两个链表首结点值小者作为新链表的首结点。

  3 遍历两个链表,取小者作为其后继结点,直到至少有一个链表为空。

  4 把至多一个非空链表首结点作为其后继结点。

  5 返回新链表的首结点。

  时间复杂度:O(len1+len2)。

  Java代码:

 1 /*
 2 public class ListNode {
 3     int val;
 4     ListNode next = null;
 5 
 6     ListNode(int val) {
 7         this.val = val;
 8     }
 9 }*/
10 public class Solution {
11     // 非递归,类似于归并排序
12     public ListNode Merge(ListNode list1, ListNode list2) {
13         // 如果至少有一个链表为空
14         if (list1 == null) {
15             return list2;
16         }
17         if (list2 == null) {
18             return list1;
19         }
20         
21         // 确定首结点
22         ListNode head = null;
23         if (list1.val <= list2.val) {
24             head = list1;
25             list1 = list1.next;
26         } else {
27             head = list2;
28             list2 = list2.next;
29         }
30         
31         ListNode cur = head;
32         while (list1 != null && list2 != null) {
33             ListNode min = null;
34             if (list1.val <= list2.val) {
35                 min = list1;
36                 list1 = list1.next;
37             } else {
38                 min = list2;
39                 list2 = list2.next;
40             }
41             
42             cur.next = min;
43             cur = min;
44         }
45         
46         // 处理剩余结点
47         if (list1 != null) {
48             cur.next = list1;
49         } else {
50             cur.next = list2;
51         }
52         
53         return head;
54     }
55 }

 

以上是关于剑指Offer 合并两个排序的链表的主要内容,如果未能解决你的问题,请参考以下文章

《剑指Offer——合并两个排序的链表,两个链表的第一个公共节点》代码

剑指offer 16.合并两个排序的链表

剑指offer——合并两个排序的链表

剑指OFFER合并两个排序的链表

[剑指offer]面试题17:合并两个排序的链表

剑指offer-合并两个排序的链表