最近在温习数据结构的时候,遇到这个习题,记录一下思路。
1.两个链表都是有序列表 。而且新链表都是使用的给定的两个链表的所有节点,所以我们可以创建一个新链表,后面的节点指向原链表的节点
2.分析单链表的数据结构 它是用指针标识数据之间的逻辑关系(数据域和指针域)(指针域存放下一节点的地址)。
设计思路:
创建一个头节点,并且创建一个新ListNode链表方便进行后续操作
2.先判断 给定的单链表是否为空;若不为空,将给定的两个链表的数据域的进行比对 如果L1单链表的值比较小,则将来新链表的next域指向L1此时指向的节点,同时要将原链表指向下一个节点;反之,将新链表的next域指向L2此时指向的节点,并且将原链表指向下一个节点。如果L1的下一节点为空,则直接将L2放入新链表中
/**
* 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 listNode=new ListNode(0);
ListNode cur=listNode;
while(l1!=null&& l2!=null)
{
if(l1.val<=l2.val){
cur.next=l1;
cur=cur.next;
l1=l1.next;
}else{
cur.next=l2;
cur=cur.next;
l2=l2.next;
}
}
if(l1==null){
cur.next=l2;
}
if(l2==null){
cur.next=l1;
}
return cur.next;
}
}
其实,我们还可以使用递归实现:
我们可以如下递归地定义在两个链表里的合并 操作(忽略边界情况,比如空链表等):
当L1.val<L2.val时候, list1[0]+merge(list1[1:],list2)
当L1.val>=L2.val时候 , list2[0]+merge(list1,list2[1:])
也就是说,两个链表头部较小的一个与剩下元素的 merge 操作结果合并。
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null){
return l2;
}
if(l2==null){
return l1;
}
if(l1.val<l2.val){
l1.next=mergeTwoLists(l1.next,l2);
return l1;
}else{
l2.next=mergeTwoLists(l1,l2.next);
return l2;
}
}