题目:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
思路:从两链表第一个结点开始比较结点的值,取较小者作为合并链表的元素,依次进行;后面如果有一个链表为空,则直接把不为空的链表接到合并链表的后面。
方法1.采用非递归方法
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode temp1=l1; ListNode temp2=l2; ListNode ret=new ListNode(0); ListNode ret1=ret; while(temp1!=null&&temp2!=null) { if(temp1.val>temp2.val) { ret.next=temp2; ret=ret.next; temp2=temp2.next; }else { ret.next=temp1; ret=ret.next; temp1=temp1.next; } } if(temp1==null&&temp2!=null) { ret.next=temp2; } if(temp2==null&&temp1!=null) { ret.next=temp1; } return ret1.next; }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
方法二.采用递归方法(待优化)
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode temp1=l1; ListNode temp2=l2; ListNode ret=getResult(temp1,temp2); return ret; } public ListNode getResult(ListNode t1,ListNode t2) { ListNode t0=new ListNode(0); ListNode head=t0; if(t1==null) return t2; if(t2==null) return t1; if(t1.val>t2.val) { t0.next=t2; t0=t0.next; t0.next=getResult(t1,t2.next); }else { t0.next=t1; t0=t0.next; t0.next=getResult(t1.next,t2); } return head.next; }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42