合并两个有序链表是很常见的一个链表相关的算法题,因为当时在练习这个题的时候,刚学完排序算法没多久,所以我在练这个题的时候第一反应就是使用归并排序的“并”的思想。当然,我并没有去算过这个算法的时间复杂度,因为目前阶段只要能做出来就好了,哈哈哈(来自一个算法菜鸟的兴奋!!!),代码如下(虽然代码看起来有点啰嗦,其实还是很简单的,很多代码都一样):

 1 /**
 2  * 合并两个有序列表,思路参考归并排序的并过程
 3  */
 4 public class MergeTwoLinked {
 5     public static void main(String[] args) {
 6         ListNode node1=new ListNode(1);
 7         ListNode node2=new ListNode(2);
 8         ListNode node3=new ListNode(3);
 9         ListNode node4=new ListNode(4);
10         node3.next=node4;
11         node2.next=node3;
12         node1.next=node2;
13 
14         ListNode node5=new ListNode(0);
15         ListNode node6=new ListNode(1);
16         ListNode node7=new ListNode(2);
17         ListNode node8=new ListNode(4);
18         node7.next=node8;
19         node6.next=node7;
20         node5.next=node6;
21 
22         ListNode head = mergeTwoLinked(node1, node5);//调用合并方法
23         while (head!=null){//输出链表节点
24             System.out.println(head.toString());
25             head=head.next;
26         }
27     }
28 
29     /**
30      * 合并两个有序列表,思路参考归并排序的并过程
31      * @param head1
32      * @param head2
33      * @return 返回合并后的链表
34      */
35     public static ListNode mergeTwoLinked(ListNode head1, ListNode head2) {
36         if(head1==null && head2==null){//当两个链表都为空时返回null
37             return null;
38         }else if(head1!=null && head2==null){//当第2个链表为null时返回第1个链表
39             return head1;
40         }else if(head1==null && head2!=null){//当第1个链表为null时返回第2个链表
41             return head2;
42         }
43         ListNode head;//定义合并后的链表的头指针
44         ListNode next;//用于记录新链表的头结点的下一个节点
45         //当第1个链表的第一个节点的值小于第2个链表的第一个节点的值时,将新链表的头结点指向第1个链表
46         if(head1.val<head2.val){
47             next=head1.next;
48             head1.next=null;
49             head=head1;
50             head1=next;
51         }else{//当第1个链表的第一个节点的值大于等于第2个链表的第一个节点的值时,将新链表的头结点指向第2个链表
52             next=head2.next;
53             head2.next=null;
54             head=head2;
55             head2=next;
56         }
57         ListNode temp=head;//用于遍历新链表
58         while (head1 != null && head2 != null) {//根据节点值的大小拼接到新链表后面,当有一个链表已经遍历完后退出
59             if (head1.val<head2.val){
60                 next=head1.next;
61                 head1.next=null;
62                 temp.next=head1;
63                 head1=next;
64                 temp=temp.next;
65             }else{
66                 next=head2.next;
67                 head2.next=null;
68                 temp.next=head2;
69                 head2=next;
70                 temp=temp.next;
71             }
72         }
73         if (head1!=null){//当第1个链表不为null时,直接拼接在新链表后面
74             temp.next=head1;
75         }
76         if (head2!=null){//当第2个链表不为null时,直接拼接在新链表后面
77             temp.next=head2;
78         }
79         return head;
80     }
81 }
82 
83 class ListNode {
84     int val;
85     ListNode next;
86 
87     public ListNode(int x) {
88         val = x;
89     }
90 
91     @Override
92     public String toString() {
93         return "ListNode{" +
94                 "val=" + val +
95                 '}';
96     }
97 }