当前位置:   article > 正文

LeetCode --- 链表相关oj题 -- 2_现有一链表的头指针listnode *phead

现有一链表的头指针listnode *phead

目录

一.链表分割

思路:

二.链表的回文结构:

 思路:

 三.相交链表(160)

思路:


一.链表分割

现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。

思路:

思路:找到比x大的值就尾插到greaterhead的链表中
           找到比x小的值就尾插到lesshead的链表中 

           到最后再让lesstail->next=greaterhead->next;

                             greatertail->next=NULL;

  1. //结构体
  2. /*
  3. struct ListNode {
  4. int val;
  5. struct ListNode *next;
  6. ListNode(int x) : val(x), next(NULL) {}
  7. };*/
  8. class Partition {
  9. public:
  10. ListNode* partition(ListNode* pHead, int x) {
  11. // write code here
  12. ListNode* lesshead=(ListNode*)malloc(sizeof(ListNode));
  13. ListNode* lesstail=lesshead;
  14. lesstail->next=NULL;
  15. ListNode* greaterhead=(ListNode*)malloc(sizeof(ListNode));
  16. ListNode* greatertail=greaterhead;
  17. greatertail->next=NULL;
  18. //思路:找到比x大的值就尾插到greaterhead的链表中
  19. //找到比x小的值就尾插到lesshead的链表中
  20. ListNode* cur=pHead;
  21. while(cur)
  22. {
  23. if(cur->val<x)
  24. {
  25. lesstail->next=cur;
  26. lesstail=cur;
  27. }
  28. else
  29. {
  30. greatertail->next=cur;
  31. greatertail=cur;
  32. }
  33. cur=cur->next;
  34. }
  35. lesstail->next=greaterhead->next;
  36. greatertail->next=NULL;
  37. ListNode* list=lesshead->next;
  38. //malloc申请的空间不使用了,要记得释放掉
  39. free(lesshead);
  40. free(greaterhead);
  41. return list;
  42. }
  43. };

二.链表的回文结构:

描述:

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

测试样例:

1->2->2->1
返回:true

 思路:

第一步:找到原链表的中间结点(mid)

第二步:逆置原链表的后半部分结点

第三步:然后把原链表的前一半和逆置后的那半个原链表的数据来进行比较,一直到某个到空为止,如果一直到达空之前,这2个部分都是相同的,那么此链表就是回文结构了

如果在这个过程中有一个位置的值不相同,那么就不是回文结构了。

  1. class PalindromeList {
  2. public:
  3. bool chkPalindrome(ListNode* A) {
  4. // write code here
  5. //第一步就是找到链表的中间结点
  6. ListNode* slow=A;
  7. ListNode* fast=A;
  8. while(fast&&fast->next)
  9. {
  10. slow=slow->next;
  11. fast=fast->next->next;
  12. }
  13. ListNode* mid=slow;
  14. //然后逆置链表的后半部分
  15. ListNode* prev=NULL;
  16. ListNode* cur=mid;
  17. ListNode* next=mid;
  18. while(cur)
  19. {
  20. next=cur->next;
  21. cur->next=prev;
  22. prev=cur;
  23. cur=next;
  24. }
  25. ListNode* curA=A;
  26. ListNode* curM=prev;
  27. //然后把原链表和逆置后的那半个原链表的数据来进行比较,一直到某个到空为止
  28. while(curA&&curM)
  29. {
  30. if(curA->val!=curM->val)
  31. return false;
  32. else
  33. {
  34. curA=curA->next;
  35. curM=curM->next;
  36. }
  37. }
  38. return true;
  39. }
  40. };

 三.相交链表(160)

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

图示两个链表在节点 c1 开始相交:

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

示例 1:

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at '8'
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。


示例 2:

输入:intersectVal = 2, listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出:Intersected at '2'
解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [1,9,1,2,4],链表 B 为 [3,2,4]。
在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。


示例 3:

输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
输出:null
解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。
由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。
这两个链表不相交,因此返回 null 。
题目链接:https://leetcode.cn/problems/intersection-of-two-linked-lists

思路:

 1:先都分别遍历一遍这2个链表,并且分别计算处它们各自的结点个数

 2:这里要判断一下,是否相交,如果不相交就直接返回NULL,就可以了

      判断是否会相交只需要去比较2个链表最后的那个结点是否相同,

      相同则一定相交,不相同则一定不相交

 3:然后让长的链表先去走长度差步

 4:然后让2个链表同时走,开始对2个链表的结点进行比较,第一个相同地址的结点就是我们所求的交点。

  1. struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
  2. {
  3. //先遍历一遍这2个链表,分别计算它们的结点个数
  4. struct ListNode* taila=headA;
  5. int sizea=1;
  6. while(taila->next)
  7. {
  8. taila=taila->next;
  9. sizea++;
  10. }
  11. struct ListNode* tailb=headB;
  12. int sizeb=1;
  13. while(tailb->next)
  14. {
  15. tailb=tailb->next;
  16. sizeb++;
  17. }
  18. //这里要判断一下,是否相交,如果不相交就直接返回NULL,就可以了
  19. //判断是否会相交只需要去比较2个链表最后的那个结点是否相同,
  20. //相同则一定相交,不相同则一定不相交
  21. if(taila!=tailb)
  22. {
  23. return NULL;
  24. }
  25. //计算2个链表的结点个数的差值(长度差)
  26. int gap=abs(sizea-sizeb);
  27. //abs是取绝对值的意思 它的头文件是 #include<stdlib.h>
  28. struct ListNode* shortlist=headA;
  29. struct ListNode* longlist=headB;
  30. //这里也只是默认headA短,headB长,下面还会进行进一步的判断的
  31. if(sizea>sizeb)
  32. {
  33. shortlist=headB;
  34. longlist=headA;
  35. }
  36. //长的链表要先走差距步 gap步
  37. while(gap--)
  38. {
  39. longlist=longlist->next;
  40. }
  41. //开始比较,看是否是回文结构
  42. while(longlist!=shortlist)
  43. {
  44. longlist=longlist->next;
  45. shortlist=shortlist->next;
  46. }
  47. return longlist;
  48. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号