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