【数据结构_链表_最小堆】 链表找环,链表找交点,合并有序链表
2014-08-02 21:27
288 查看
Linked List Cycle
Given a linked list, determine if it has a cycle in it.Follow up:
Can you solve it without using extra space?
对链表反序: while(p) { q=p->next; p->next=f; f=p;p=q;}
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: bool hasCycle(ListNode *head) { ListNode *p=head,*q,*f=NULL; while(p){//对链表反序,如果p回到起点,则有环 q=p->next; p->next=f; f=p;p=q; if(p==head) return true;//有环 } return false;//沒有环,p到了NULL } };
合并有序链表
用优先队列(小顶堆)class Solution {
public:
struct cmp{
bool operator () ( const pair<int, int> &a, const pair<int, int > &b){
return a.first >= b.first;
}
}cc;
ListNode *mergeKLists(vector<ListNode *> &lists) {
priority_queue<pair<int, int>, vector<pair<int, int> >, cmp> que;
for(int i=0; i<lists.size(); i++) if(lists[i])
que.push(pair<int, int>(lists[i]->val, i));
ListNode *head =NULL, *tail =NULL;
while(!que.empty()){
pair<int, int> t = que.top(); que.pop();
int i = t.second;
if(!head) head = lists[i];
else tail -> next = lists[i];
tail = lists[i];
lists[i] = lists[i]->next;
if(lists[i])
que.push(pair<int, int>(lists[i]->val, i));
}
if(tail) tail->next = NULL;
return head;
}
};
相关文章推荐
- 数据结构-用链表函数实现链表的有序合并
- c语言数据结构中两个有序链表合并为一个新链表
- 【算法】合并k个有序的链表-基于最小堆的思想
- 数据结构_中国大学MOOC(慕课)——两个有序链表序列的合并问题
- c语言版数据结构(奇迹冬瓜)-链表实战(2)合并两有序线性表
- 有序链表的合并(数据结构---单链表)
- 1465 数据结构:有序链表的合并
- 02-线性结构1 两个有序链表序列的合并——中国大学MOOC-陈越、何钦铭-数据结构-2017秋
- 【数据结构练习】2.两个有序链表序列的合并
- 数据结构-剑指offer-合并有序链表
- 数据结构整理_有序链表合并
- 数据结构学习---有序链表的合并
- 【MOOC—数据结构习题】两个有序链表序列的合并
- 数据结构----实现对2个链表La,Lb有序合并,对相同的元素进行删除,
- 数据结构之将两个递增的有序链表合并为一个递增的有序链表
- 2-11. 两个有序链表序列的合并(15):链表数据结构基础练习
- 数据结构 P31 算法实现 有序链表合并为有序链表
- PAT数据结构_02-线性结构1 两个有序链表序列的合并 (15分)
- [数据结构]02-线性结构1 两个有序链表序列的合并
- 数据结构 02-线性结构1 两个有序链表序列的合并