MergeLinklist

写了一个合并有序链表,代码有点纠结啊,涉及到指针就是麻烦,DS课曹老师课件说linklist是DS的难点。。。

如果数组就很简单了,链表就要小心。

里面遇到的一些情况,第一,最好是先确定l1归到l2还是相反,我是把l1归到L2,返回l2, 而且要先把l2的位置定好,只要比较第一次就可以确定了。否则后面写逻辑那叫一个纠结啊。。。

然后后面比较两个大小,类似于数组归并,prev1,prev1表示当前节点前一个节点,因为linklist要link起来都要prev。

后面需要判断是否有头插,因为头插的prev比较特殊,我用NULL来区分是否头插,后面就不用了,因此在一开始区分l2的位置是在这里看是有好处的。然后最后结束的时候,看下,如果p2==NULL 说明p1还有一些最大的数,直接append到prev2的后面就可以了。:)

附上代码,一次AC但是在IDE调了一会儿=。= 之前还直接都不调,导致各种编译问题= =

ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {//move l1 to l2
	if(l1==NULL) return l2;//including l2 null, not null
	if(l1!=NULL&&l2==NULL) return l1;
    ListNode *p1=l1,*prev1=l1, *p2=l2, *prev2=NULL,*p1next,*p2next;
	bool startpoint=false;

	if(l1->val<l2->val)l2=l1;
	while(p1!=NULL&&p2!=NULL)
	{
		if(p1->val>=p2->val)
		{
			/*
			if(startpoint==false)
			{
				startp=p2;
				startpoint=true;
			}*/
			prev2=p2;
			p2=p2->next;
		}
		else
		{
			p1next=p1->next;

			if(prev2==NULL)//first, insert into L2 head
			{
				prev2=p1;p1->next=p2;
			}
			else
			{
				prev2->next=p1;
				p1->next=p2;
			}
			prev2=p1;
			p1=p1next;
		}
	}
	if(p1==NULL)return l2;
	if(p2==NULL) {prev2->next=p1;return l2;}
}

MergeLinklist

时间: 2024-10-26 08:10:52

MergeLinklist的相关文章

链表面试题Java实现【重要】

本文包含以下内容: 1.单链表的创建和遍历 2.求单链表中节点的个数 3.查找单链表中的倒数第k个结点(剑指offer,题15) 4.查找单链表中的中间结点 5.合并两个有序的单链表,合并之后的链表依然有序[出现频率高](剑指offer,题17) 6.单链表的反转[出现频率最高](剑指offer,题16) 7.从尾到头打印单链表(剑指offer,题5) 8.判断单链表是否有环 9.取出有环链表中,环的长度 10.单链表中,取出环的起始点(剑指offer,题56) 11.判断两个单链表相交的第一个

单链表的各种操作

#include <stdio.h> #include <stdlib.h> typedef struct { char data; struct Node * next; }Node, *LinkList; void meau(); LinkList CreateFromHead(); void ListLength(LinkList L); void printLink(LinkList L); LinkList inversePermutation(LinkList L);

线性表之单链表学习小结(初学数据结构必看)

花了好几个小时,详细规划出了整个过程,包括所有基本操作...有什么疑问请下方留言 #include<iostream> using namespace std; #define ElemType char #define ERROR 0 #define OK 1 typedef struct Node { ElemType data; struct Node *next; }Node,*LinkList; void init_linklist(LinkList L)/*对单链表进行初始化*/

单链表练习题

1.单链表归并 /** * 有序的两个单链表归并 * @param object $listA 待归并的单链表A * @param object $listB 待归并的单链表B * @return object $merge 归并之后的单链表 */ function mergeLinkList($listA, $listB) { $p_a = $listA->head->next; // A的工作指针 $p_b = $listB->head->next; // B的工作指针 $me

合并两个有序的单链表,合并之后的链表依然有序【出现频率高】

合并两个有序的单链表,合并之后的链表依然有序: 这道题经常被各公司考察. 例如: 链表1:   1->2->3->4 链表2:   2->3->4->5 合并后:   1->2->2->3->3->4->4->5 解题思路:   挨着比较链表1和链表2.   这个类似于归并排序.尤其要注意两个链表都为空.和其中一个为空的情况.只需要O (1) 的空间.时间复杂度为O (max(len1,len2)) public Node me

JAVA实现链表面试题

这篇文章主要介绍了JAVA相关实现链表的面试题,代码实现非常详细,每一个方法讲解也很到位,特别适合参加Java面试的朋友阅读. 这份笔记整理了整整一个星期,每一行代码都是自己默写完成,并测试运行成功,同时也回顾了一下<剑指offer>这本书中和链表有关的讲解,希望对笔试和面试有所帮助. 本文包含链表的以下内容: 1.单链表的创建和遍历 2.求单链表中节点的个数 3.查找单链表中的倒数第k个结点(剑指offer,题15) 4.查找单链表中的中间结点 5.合并两个有序的单链表,合并之后的链表依然有

单链表的头插、尾插、删除、合并等操作

单链表的头插.尾插.删除.合并等操作实现代码如下: #include<iostream> using namespace std; //单链表的存储结构 typedef struct Node { int data; struct Node* next; }Node,*LinkList;//LinkList为结构指针类型 //初始化单链表 void InitList(LinkList *L) { *L = (LinkList)malloc(sizeof(Node));//建立头结点 (*L)-

合并两个有序单链表

给出两个有序的单链表,将这两个单链表进行合并,合并出来的链表仍然是有序的. 比如给出链表1:1->3->6->7;链表2:2->4->5->8->9 合并后的链表为:1->2->3->4->5->6->7->8->9 代码展示如下(只给出实现部分) 结构体定义: typedef struct LinkNode { DataType data; struct LinkNode *next; }LinkNode,*pLi

递归实现两个有序链表的合并

package com.wyl.linklist; /** * 合并两个链表 * @author wyl */ public class MergeLinkList { /** * 内部类,链表节点的结构 * @author wyl * */ public static class Node{ private int val; //节点值 private Node next; //节点的后继节点 public Node(){ } public Node(int val){ this(val,nu