链表结点结构
class ListNode{ int value; ListNode next = null; public ListNode(int value){ this.value = value; }}
题目描述
- 输入两个单调递增的链表,输出两个链表合成后的链表
- 当然我们需要合成后的链表满足单调不减规则
递归解法
- 比较两个链表的开头结点,则可以确定合并后链表的第一个结点
- 除合并后的结点外,再次比较两个链表的开头结点,则可以确定合并后链表的第二个结点
- 以此类推,直到所有结点均成为合并后链表中的结点
public static ListNode merge(ListNode list1,ListNode list2) { if(list1 == null){ return list2; } if(list2 == null){ return list1; } ListNode mergeListHead = null; if(list1.value < list2.value){ mergeListHead = list1; mergeListHead.next =merge(list1.next,list2); }else{ mergeListHead = list2; mergeListHead.next = merge(list1,list2.next); } return mergeListHead;}
非递归解法
- 初始化合并后的头结点
- 遍历两个链表,取出较小的结点,加入到合并链表中
- 如果长度不同,处理剩余的结点到合并链表中
public static ListNode merge2(ListNode list1,ListNode list2) { if(list1 == null){ return list2; } if(list2 == null){ return list1; } ListNode mergeList = null; ListNode curNode = null; //初始化第一个结点 if(list1.value < list2.value){ curNode = list1; list1 = list1.next; curNode.next = null; mergeList = curNode; }else{ curNode = list2; list2 = list2.next; curNode.next = null; mergeList = curNode; } //遍历两个链表,取出较小的结点,加入到合并链表中 ListNode mergeNode = mergeList; while(list1 != null && list2 != null){ if(list1.value < list2.value){ curNode = list1; list1 = list1.next; curNode.next = null; mergeNode.next = curNode; mergeNode = mergeNode.next; }else{ curNode = list2; list2 = list2.next; curNode.next = null; mergeNode.next = curNode; mergeNode = mergeNode.next; } } //处理剩余的结点 while(list1 != null){ curNode = list1; list1 = list1.next; curNode.next = null; mergeNode.next = curNode; mergeNode = mergeNode.next; } while(list2 != null){ curNode = list2; list2 = list2.next; curNode.next = null; mergeNode.next = curNode; mergeNode = mergeNode.next; } return mergeList;}<p></p>